using System.Text.Json.Nodes;

namespace System.Text.Json;

public static class JsonExtensions
{
    /// <summary>
    /// 尝试解析提供的 <paramref name="jsonNode"/>。
    /// 如果成功，返回 <see langword="true"/>
    /// 且 <paramref name="result"/> 包含序列化的对象。
    /// 否则返回 <see langword="false"/> 且 <paramref name="result"/>
    /// 包含 <typeparamref name="T"/> 的 <see langword="default"/>.
    /// </summary>
    public static bool TryParse<T>(this JsonNode jsonNode, out T result)
    {
        try
        {
            result = jsonNode.Deserialize<T>();
            return true;
        }
        catch
        {
            result = default;
            return false;
        }
    }

    /// <summary>
    /// 将提供的 <paramref name="node"/> 转换为适当的基元类型：<see langword="string"/>、
    /// <see langword="decimal"/>、<see langword="bool"/> 或 <see langword="null"/>。
    /// 如果 <paramref name="node"/> 是数组或对象，则将其序列化为 JSON <see langword="string"/>.
    /// </summary>
    public static IComparable ToComparable(this JsonNode node) =>
        node.GetValueKind() switch
        {
            JsonValueKind.String => node.GetValue<string>(),
            JsonValueKind.Number => node.GetValue<decimal>(),
            JsonValueKind.True => true,
            JsonValueKind.False => false,
            JsonValueKind.Object => node.ToString(),
            JsonValueKind.Array => node.ToString(),
            _ => null,
        };
}
